import type { Request, Response } from 'express';

import { z } from 'zod';

import { IRepo, RepoModel } from '../../../models/repo';
import Resp from '../../../utils/response';

// 参数校验规则
export const validator = z.object({
  branch: z
    .string({
      invalid_type_error: 'Git仓库分支必须是字符串',
      required_error: 'Git仓库分支不能为空',
    })
    .min(1, 'Git仓库分支不能为空'),
  git: z
    .string({
      invalid_type_error: 'Git仓库地址必须是字符串',
      required_error: 'Git仓库地址不能为空',
    })
    .min(1, 'Git仓库地址不能为空')
    .regex(
      /^(?:https?:\/\/|git@)[\w.-]+[/:]([\w.-]+\/[\w.-]+)(?:\.git)?$/,
      'Git仓库地址格式无效，请提供有效的Git仓库URL',
    ),
  remark: z
    .string()
    .max(500, '描述不能超过500个字符')
    .transform(val => val?.trim())
    .default(''),
  type: z.enum(['base', 'components', 'pages'], {
    invalid_type_error: '仓库类型无效',
    required_error: '仓库类型不能为空',
  }),
});

// 创建仓库API
export const api = async (req: Request, res: Response): Promise<Response> => {
  try {
    const { branch, git, remark, type } = req.body as z.infer<typeof validator>;

    // 提取仓库名（去除.git后缀，兼容多种格式）
    const repoPath = git.split('/').pop() || '';
    const repoName = repoPath.replace(/\.git$/, '');
    const name = `${repoName}-${branch}`;

    // 检查仓库是否已存在
    const existingRepo = await RepoModel.findOne({ name });
    if (existingRepo) {
      return Resp.error(res, 400, `仓库 ${name} 已存在`);
    }

    // 构建仓库数据
    const repoData: IRepo = { branch, git, name, remark, type };

    // 保存仓库数据到数据库
    const repo = new RepoModel(repoData);
    const result = await repo.save();

    // 返回成功响应
    return Resp.success(res, result, '仓库创建成功');
  } catch (error) {
    console.error(error);
    return Resp.catch(res, error);
  }
};
